package rkdwogus7.basic;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class J18_JDBCSetup {
	
	// JDBC 접속 정보
	private static final String DRV = "oracle.jdbc.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@//localhost:1521/xe";
	private static final String USR = "scott";
	private static final String PWD = "TIGER";
	// 얘고 나중에는 상수로 빼서 인터페이스에 넣을거야.DRV와 URL은 다른 프로그램이면 바뀌는거고.
	// URL은 나중에는 원격 오라클인 122번 주소에서 작업 가능하게 해 줄거야.
	
	// SQL문 작성
	// update, delete문도 작성해 두고 나중에는 String도 + 말고 buffer나 builder를 사용하게 될거야.
	// 저장 procedure를 활용하는 방법도 알고 있다면 장난 아니겠지.
	// 정말 나중에는 mybatis 나 hibernate 를 이용하면 돼
	// 또한 String을 연결시켰을 경우에는 " <- 이 빈 칸 잊지 말도록. 앞 뒤로 넣을 것을 권장해.
	private static final String insertSQL = "insert into sungjuk" + "(sjno, name, kor, eng, mat)"
	 + "VALUES (SJNO.nextval, '혜교', " + " 78, 45, 12) ";
	// 입력받아서 처리하게끔 만드는 것을 또 할거야.
	private static final String selectSQL = " select * from sungjuk " + "order by sjno desc";

	public static void main(String[] args) {
		// 오라클을 이용한 JDBC 프로그래밍 기초
		// 1. JDBC 드라이버를 메모리에 적재하여
		// 객체로 생성하고 이것을 DriverManager에 등록
		// 2. DriverManager의 getConnection method를 이용해서
		// 데이터베이스 연결객체를 생성함(DB접속정보를 가져오는거야)
		// 3. PreparedStatement로 실행할 SQL문 객체를 생성 
		// 4. 실행하는 SQL문이 insert, update, delete라면 executeUpdate()를 사용하고 실행결과는 int 로 받음
		// 4-2. 실행하는 SQL문이 select라면 executeQuery()를 사용하고 실행결과는 ResultSet 으로 받음
		
		// 5. ResultSet으로 받은 결과는 먼저 rs.next()로 읽어 올 레코드(행)를 가리킨 후
		// rs.getXXX( 필드번호 ) 또는 rs.getXXX( 필드이름 )으로
		// 테이블의 각 필드 값을 처리할 수 있음
		
		// 6. JDBC 작업이 끝나면 연결중인 데이터베이스 접속을 끊고 
		// 관련 객체 (conn, ps, rs )는 메모리에서 제거함
		
		Connection conn = null;  // 연결객체 저장용
		PreparedStatement ps = null; // SQL 객체 생성용
		ResultSet rs = null; // 실행결과 저장용
		
		try {
			Class.forName( DRV );    // 1.
			conn = DriverManager.getConnection(URL, USR, PWD);    // 2.
			ps = conn.prepareStatement( insertSQL );
			int cnt = ps.executeUpdate();    // 4.
			System.out.println( cnt + "건의 데이터 입력" );
			
			ps.close();    // 또다른 SQL문 작성하기 위해 기존 ps 객체 제거
			
			ps = conn.prepareStatement( selectSQL );
			rs = ps.executeQuery();
			
			// ResultSet에서 결과를 레코드 단위로 꺼내 차례대로 출력
			while(rs.next()) {  // 5.
				System.out.println( rs.getInt(1) );
				System.out.println( rs.getString("name") );
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			// 6. 
			// JDBC 작업이 끝난 후 메모리에서 객체 제거
			if ( rs != null )
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			if ( ps != null )
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			if ( conn != null )
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}
		
		
		
	}

	
	
}







